home *** CD-ROM | disk | FTP | other *** search
- /*
- ** AsyncPB is an example of how File System calls can be made
- ** in a chain from an interrupt handler like the Time Manager.
- ** Once you select DoIt from the menu give it a little time to actually
- ** process the input file.
- **
- ** James "im" Beninghaus. DTS.
- */
-
- #include <Aliases.h>
- #include <AppleEvents.h>
- #include <Balloons.h>
- #include <Controls.h>
- #include <Desk.h>
- #include <Dialogs.h>
- #include <Events.h>
- #include <Errors.h>
- #include <Files.h>
- #include <Folders.h>
- #include <Fonts.h>
- #include <GestaltEqu.h>
- #include <Icons.h>
- #include <Memory.h>
- #include <Menus.h>
- #include <OSUtils.h>
- #include <Packages.h>
- #include <Printing.h>
- #include <Quickdraw.h>
- #include <Resources.h>
- #include <Script.h>
- #include <StandardFile.h>
- #include <String.h>
- #include <Strings.h>
- #include <SysEqu.h>
- #include <Terminals.h>
- #include <TerminalTools.h>
- #include <TextEdit.h>
- #include <Timer.h>
- #include <ToolUtils.h>
- #include <Traps.h>
- #include <Types.h>
- #include <Windows.h>
-
- #define isStationary 2048
-
- #define ApplicationMenuBar 128
- #define AppleMenu 128
- #define AboutItem 1
- #define FileMenu 129
- #define DoIt 1
- #define QuitItem 2
-
- #define AboutAlert 128
- #define kWindowKind 'im'
-
- Boolean gInForeGround = true;
- Boolean gProcessing = true;
- unsigned long gSleep = 0;
-
- void DoMenu (short menu, short item);
- void EventLoop (void);
- int main (void);
-
-
-
- typedef struct MyParamBlockRec
- {
- IOParam ioParam;
-
- ProcPtr setFPosIOCompletion;
- ProcPtr readIOCompletion;
- ProcPtr writeIOCompletion;
-
- short readFileRefNum;
- short writeFileRefNum;
-
- TMTaskPtr tm;
-
- } MyParamBlockRec, *MyParamBlockPtr;
-
-
-
-
- typedef struct TaskRec
- {
- QElemPtr qLink;
- short qType;
- TimerProcPtr tmAddr;
- long tmCount;
-
- MyParamBlockPtr pb;
-
- } MyTaskRec, *MyTaskPtr;
-
-
-
-
- MyTaskRec gTM;
- MyParamBlockRec gPB;
- char gBuffer;
-
-
- MyParamBlockPtr GetParmBlockPtr() = { 0x2008 }; // move.l a0, d0 ;move the pointer to where MPW C places function results
- MyTaskPtr GetTMTaskPtr() = { 0x2009 }; // move.l a1, d0 ;move the pointer to where MPW C places function results
-
-
- void PBWriteIOCompletion()
- {
- auto MyParamBlockPtr pb = GetParmBlockPtr();
-
- if (noErr == (*pb).ioParam.ioResult)
- {
- PrimeTime((QElemPtr) (*pb).tm, 1000 * 1);
- }
- }
-
- void PBReadIOCompletion()
- {
- auto MyParamBlockPtr pb = GetParmBlockPtr();
-
- if (noErr == (*pb).ioParam.ioResult)
- {
- (*pb).ioParam.ioCompletion = (*pb).writeIOCompletion;
- (*pb).ioParam.ioRefNum = (*pb).writeFileRefNum;
- (*pb).ioParam.ioReqCount = (*pb).ioParam.ioActCount;
- (*pb).ioParam.ioPosMode = fsAtMark;
- (*pb).ioParam.ioPosOffset = 0;
- (void) PBWriteAsync((ParmBlkPtr) pb);
- }
- }
-
- void PBSetFPosIOCompletion()
- {
- auto MyParamBlockPtr pb = GetParmBlockPtr();
-
- if (noErr == (*pb).ioParam.ioResult)
- {
- (*pb).ioParam.ioCompletion = (*pb).readIOCompletion;
- (*pb).ioParam.ioRefNum = (*pb).readFileRefNum;
- (*pb).ioParam.ioReqCount = 1;
- (*pb).ioParam.ioPosMode = fsAtMark;
- (*pb).ioParam.ioPosOffset = 0;
- (void) PBReadAsync((ParmBlkPtr) pb);
- }
- }
-
- pascal void TMTaskProc()
- {
- auto MyTaskPtr tm = GetTMTaskPtr();
-
- (*(*tm).pb).ioParam.ioCompletion = (*(*tm).pb).setFPosIOCompletion;
- (*(*tm).pb).ioParam.ioRefNum = (*(*tm).pb).readFileRefNum;
- (*(*tm).pb).ioParam.ioPosMode = fsFromMark;
- (*(*tm).pb).ioParam.ioPosOffset = 2;
- (void) PBSetFPosAsync((ParmBlkPtr) (*tm).pb);
- }
-
- void DoMenu(short menu, short item)
- {
- OSErr error = noErr;
- Str255 daName;
- short daRefNum;
- Point where = { 30, 10 };
-
- switch (menu)
- {
- case AppleMenu :
- {
- switch (item)
- {
- case AboutItem :
- {
- Alert(AboutAlert, nil);
- }
- break;
-
- default :
- {
- GetItem(GetMHandle(AppleMenu), item, daName);
- daRefNum = OpenDeskAcc(daName);
- }
- break;
- }
- }
- break;
-
- case FileMenu :
- {
- switch (item)
- {
- case DoIt :
- {
- DisableItem(GetMHandle(FileMenu), DoIt);
-
- error = FSOpen("\pinData", 0, &gPB.readFileRefNum);
-
- error = FSDelete("\pOutData", 0);
- error = Create("\pOutData", 0, 'MPS ', 'TEXT');
- error = FSOpen("\pOutData", 0, &gPB.writeFileRefNum);
-
- gPB.ioParam.ioBuffer = &gBuffer;
- gPB.tm = (TMTaskPtr) &gTM;
-
- gPB.setFPosIOCompletion = (ProcPtr) PBSetFPosIOCompletion;
- gPB.readIOCompletion = (ProcPtr) PBReadIOCompletion;
- gPB.writeIOCompletion = (ProcPtr) PBWriteIOCompletion;
-
-
- #if false
- gPB.ioParam.ioCompletion = gPB.setFPosIOCompletion;
- gPB.ioParam.ioRefNum = gPB.readFileRefNum;
- gPB.ioParam.ioPosMode = fsFromMark;
- gPB.ioParam.ioPosOffset = 3;
- (void) PBSetFPosAsync((ParmBlkPtr) &gPB);
- #else
- gTM.qType = 0;
- gTM.tmCount = 0;
- gTM.tmAddr = &TMTaskProc;
- gTM.pb = &gPB;
- InsTime((QElemPtr) &gTM);
- PrimeTime((QElemPtr) &gTM, 1000 * 1);
- #endif
-
- }
- break;
-
- case QuitItem :
- {
- RmvTime((QElemPtr)&gTM);
- gProcessing = false;
- }
- break;
- }
- }
- break;
-
- default :
- {
- }
- break;
-
- }
- }
-
- void EventLoop()
- {
- OSErr error = noErr;
- EventRecord event;
- Boolean gotEvent;
- WindowPtr window;
- DialogPtr dialog;
- short itemHit;
- short part;
- long menuItem;
- short menu;
- short item;
-
- gotEvent = WaitNextEvent(everyEvent, &event, gSleep, nil);
-
- if (IsDialogEvent(&event))
- {
- if (! ((keyDown == event.what || autoKey == event.what) && (event.modifiers & cmdKey)))
- {
- if (DialogSelect(&event, &dialog, &itemHit))
- {
- }
- }
- }
- else
- {
- switch (event.what)
- {
- case nullEvent:
- {
- }
- break;
-
- case mouseDown:
- {
- switch (part = FindWindow(event.where, &window))
- {
- case inMenuBar:
- {
- menuItem = MenuSelect(event.where);
- menu = HiWord(menuItem);
- item = LoWord(menuItem);
- DoMenu(menu, item);
- HiliteMenu(0);
- }
- break;
-
- case inContent :
- {
- if (! (*(WindowPeek)window).hilited)
- {
- SelectWindow(window);
- }
- else
- if (kWindowKind == (*(WindowPeek)window).windowKind)
- {
- }
- }
- break;
-
- case inGrow :
- {
- #define kMinWidth 128
- #define kMinWeight 64
- auto Rect limitRect;
- auto long newSize;
-
- if (kWindowKind == (*(WindowPeek)window).windowKind)
- {
- limitRect = qd.screenBits.bounds;
- InsetRect(&limitRect, 8, 8);
- limitRect.top = kMinWeight;
- limitRect.left = kMinWidth;
- newSize = GrowWindow(window, event.where, &limitRect);
- if (0 != newSize)
- {
- SizeWindow(window, LoWord(newSize), HiWord(newSize), true);
- }
- }
- }
- break;
-
- case inDrag:
- {
- DragWindow(window, event.where, &qd.screenBits.bounds);
- }
- break;
-
- case inGoAway :
- {
- if (TrackGoAway(window, event.where))
- {
- }
- }
- break;
-
- case inZoomIn :
- case inZoomOut :
- {
- if (kWindowKind == (*(WindowPeek)window).windowKind)
- {
- if ( TrackBox(window, event.where, part) )
- {
- SetPort(window);
- EraseRect(&window->portRect);
- ZoomWindow(window, part, true);
- InvalRect(&window->portRect);
- }
- }
- }
- break;
-
- }
- }
- break;
-
- case updateEvt:
- {
- window = (WindowPtr) event.message;
- if (kWindowKind == (*(WindowPeek)window).windowKind)
- {
- SetPort(window);
- BeginUpdate(window);
- {
- }
- EndUpdate(window);
- }
- }
- break;
-
- case activateEvt:
- {
- window = (WindowPtr) event.message;
- if (kWindowKind == (*(WindowPeek)window).windowKind)
- {
- }
- }
- break;
-
- case autoKey:
- case keyDown:
- {
- auto char key;
-
- key = event.message & charCodeMask;
- if (event.modifiers & cmdKey)
- {
- menuItem = MenuKey(key);
- menu = HiWord(menuItem);
- item = LoWord(menuItem);
- DoMenu(menu, item);
- }
- else
- {
- window = FrontWindow();
- if (kWindowKind == (*(WindowPeek)window).windowKind)
- {
- }
- }
- }
- break;
-
- case osEvt:
- {
- switch ((event.message >> 24) & 0x0FF)
- {
- case suspendResumeMessage:
- {
- gInForeGround = 0 != (event.message & resumeFlag);
- }
- break;
- }
- }
- break;
-
- case kHighLevelEvent:
- {
- error = AEProcessAppleEvent(&event);
- }
- break;
- }
- }
- }
-
- main ()
- {
- OSErr error = noErr;
- Handle menuBar;
-
- InitGraf(&qd.thePort);
- InitFonts();
- InitWindows();
- InitMenus();
- TEInit();
- InitDialogs(nil);
- InitCursor();
-
-
- menuBar = GetNewMBar(ApplicationMenuBar);
- if (nil == menuBar)
- {
- error = ResError();
- if (noErr == error)
- {
- error = resNotFound;
-
- ExitToShell();
- }
- }
- else
- {
- SetMenuBar(menuBar);
- DisposHandle(menuBar);
- AddResMenu(GetMHandle(AppleMenu), 'DRVR');
- DrawMenuBar();
- }
-
- while (gProcessing)
- EventLoop();
- }